package net.losjuegos.core.servicios;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import net.losjuegos.core.dominios.Bebida;
import net.losjuegos.core.dominios.Bebida.BebidaType;
import net.losjuegos.core.factories.BebidaFactorySingleton;

/**
 * Implementaci�n para ser usada en MySQL
 * 
 * @author Accenture Capacitaci�n Java en La Plata - Jul 2013
 * 
 */
public class BebidaRepository implements IBebidaRepository {
	private DataSource dataSource;

	public BebidaRepository(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	/**
	 * @return true si se agrego exitosamente, false en caso contrario
	 */
	public void add(Bebida bebida) {
		String sql = "INSERT INTO bebida (nombre, tipo) VALUES (?, ?)";
		PreparedStatement pst = null;
		Connection conn = null;
		try {
			conn = dataSource.getConnection();
			pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

			pst.setString(1, bebida.getNombre());
			pst.setString(2, bebida.getTipo().toString());

			pst.executeUpdate();

			ResultSet rs = pst.getGeneratedKeys();
			if (rs.next()) {
				int idBebida = rs.getInt(1);
				bebida.setId(idBebida);
			}
		} catch (SQLException sqle) {
			throw new DAOException(sqle);
		} finally {
			try {
				if (pst != null)
					pst.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
				// este es el �nico caso en que se puede NO HACER NADA con una
				// excepcion
			}
		}
	}

	public List<Bebida> list() {
		String sql = "SELECT * FROM bebida";
		PreparedStatement pst = null;
		Connection conn = null;
		List<Bebida> bebidas = new ArrayList<Bebida>();
		try {
			conn = dataSource.getConnection();
			pst = conn.prepareStatement(sql);
			ResultSet rs = pst.executeQuery();
			while (rs.next()) {
				BebidaType bt = BebidaType.valueOf(rs.getString("tipo"));
				Bebida bebida = BebidaFactorySingleton.getInstance()
						.crearBebida(bt);
				bebida.setId(rs.getInt("id"));
				bebida.setNombre(rs.getString("nombre"));
				// agrego a la lista
				bebidas.add(bebida);
			}

		} catch (SQLException sqle) {
			throw new DAOException(sqle);
		} finally {
			try {
				if (pst != null)
					pst.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
				// este es el �nico caso en que se puede NO HACER NADA con una
				// excepcion
			}
		}
		return bebidas;
	}

	public void eliminarBebida(Bebida bebida) {
		String sql = "delete from bebida where id = ?";
		PreparedStatement pst = null;
		Connection conn = null;
		try {
			conn = dataSource.getConnection();
			pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			pst.setInt(1, bebida.getId());
			pst.executeUpdate();
		} catch (SQLException sqle) {
			throw new DAOException(sqle);
		} finally {
			try {
				if (pst != null)
					pst.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {
			}
		}
	}

	public Bebida findById(int idBebida) {
		String sql = "SELECT * FROM bebida where id = ?";
		PreparedStatement pst = null;
		Connection conn = null;
		try {
			conn = dataSource.getConnection();
			pst = conn.prepareStatement(sql);
			pst.setInt(1, idBebida);
			ResultSet rs = pst.executeQuery();
			if (rs.next()) {
				Bebida bebida = BebidaFactorySingleton.getInstance()
						.crearBebida(BebidaType.valueOf(rs.getString("tipo")));
				bebida.setId(rs.getInt("id"));
				bebida.setNombre(rs.getString("nombre"));

				if (rs.next())
					throw new DAOException("Hay mas de una bebida con ese id");
				return bebida;
			} else {
				return null;
			}
		} catch (SQLException sqle) {
			throw new DAOException(sqle);
		} finally {
			try {
				if (pst != null)
					pst.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {

			}
		}

	}

	public Bebida actualizarBebida(Bebida b) {
		String sql = " update bebida set nombre = ?, tipo = ? where id = ? ";
		PreparedStatement pst = null;
		Connection conn = null;
		try {
			System.out.println("repositoty.actualizarBebida().Nombre: "
					+ b.getNombre() + ".id: " + b.getId() + "tipo: "
					+ String.valueOf(b.getTipo()));
			conn = dataSource.getConnection();
			pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

			pst.setString(1, b.getNombre());
			pst.setString(2, String.valueOf(b.getTipo()));
			pst.setInt(3, b.getId());
			pst.executeUpdate();
			// ResultSet rs = pst.getGeneratedKeys();
			return b;
		} catch (SQLException sqle) {
			throw new DAOException(sqle);
		} finally {
			try {
				if (pst != null)
					pst.close();
				if (conn != null)
					conn.close();
			} catch (Exception e) {

			}
		}

	}

}
